#!/usr/bin/env python
# coding: utf-8

import os
import sys
import time
import socket
import random

def mkdirp(dir_name):
    try:
        os.makedirs(dir_name)
    except:
        pass 

def main(sync_dir, input_dir):
    lock_dir = os.path.join(sync_dir, 'locks')
    files_dir = os.path.join(sync_dir, 'files')
    mkdirp(lock_dir)
    mkdirp(files_dir)
    
    while True:
        time.sleep(random.randint(5, 60))
        # ждём, пока все процессы заберут свои локи
        while len(os.listdir(lock_dir)) > 0:
            #time.sleep(random.randint(5, 30))
            time.sleep(10)
        
        # пишем свой лок
        stamp_fname = "%f_%s_%s" % (time.time(), socket.gethostname(), os.getpid())
        fobj = open(os.path.join(lock_dir,stamp_fname), 'w')
        fobj.close()
        
        # убеждаемся, что мы первые в очереди
        while True:
            lock_files = sorted(os.listdir(lock_dir))
            if lock_files[0] != stamp_fname:
                sys.stderr.write('%s: %s\n' % (stamp_fname, ','.join(lock_files)))
                time.sleep(10)
            else:
                break
        
        # выбираем файл на обработку
        complete_files = set(os.listdir(files_dir))
        all_files      = set(os.listdir(input_dir))
        files_to_process = sorted(all_files.difference(complete_files))
        
        if files_to_process:
            file_to_process = files_to_process[0]
            fobj = open(os.path.join(files_dir, file_to_process), 'w')
            fobj.close()
            os.unlink(os.path.join(lock_dir,stamp_fname))
            print file_to_process
            break
        else:
            os.unlink(os.path.join(lock_dir,stamp_fname))
            break
        


if __name__ == '__main__':
    sync_dir, input_dir = sys.argv[1:3]
    main(sync_dir, input_dir)
